package learn.up.java.thread.threads;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 *Lock是java.util.concurrent.locks包下的接口，Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作
 * @author NANUTO
 * @date 2017年12月10日 下午1:05:20
 */
public class Lock1 {
	
	public static void main(String[] args) {
		NormalLock demo1 = new NormalLock();
		ExecutorService pool = Executors.newFixedThreadPool(3);
		pool.execute(() -> {
			demo1.print("zhangshan");
		});
		pool.execute(() -> {
			demo1.print("lisi");
		});
		pool.shutdown();
	}
	
}
class NormalLock {
	//锁对象
	private Lock lock = new ReentrantLock();
	/**
	 * 这样就实现了和sychronized一样的同步效果，需要注意的是，用sychronized修饰的方法
	 * 或者语句块在代码执行完之后锁自动释放，而用Lock需要我们手动释放锁，所以为了保证
	 * 锁最终被释放(发生异常情况)，要把互斥区放在try内，释放锁放在finally内。
	 * @param str
	 */
	public void print(String str) {
		lock.lock();
		try {
			char[] charArray = str.toCharArray();
			for (int i = 0; i < charArray.length; i ++) {
				System.out.print((char)charArray[i]);
				Thread.sleep(20);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//释放锁
			lock.unlock();
		}
	}
}

